package waimai;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import java.io.*;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @author huangya
 * @date 2022/3/22
 */
public class ASSSSS {

    public static void main(String[] args) throws IOException {
        String tts = "";
        String slotRecordStr = "{\"eleUserId\":\"62082927\",\"currentSlot\":{\"tradeTime\":\"\",\"address\":{},\"storeName\":\"\",\"items\":[{\"itemName\":\"美食\"}]},\"query\":\"帮我买点吃的\",\"updateTime\":1737369604075,\"userId\":\"9000000000817370\",\"havanaId\":\"2204332148477\",\"nluResp\":{\"mainIntent\":\"推荐商品\",\"slot\":{\"tradeTime\":\"\",\"confirmOrder\":false,\"searchType\":\"正常搜索\",\"shopName\":\"\",\"goods\":[{\"itemId\":\"\",\"number\":1,\"name\":\"\",\"action\":\"新增商品\",\"index\":-1,\"attributes\":{\"keywords\":[],\"taste\":\"\",\"specifications\":{},\"foodCategory\":\"\",\"scene\":\"\"}}],\"confirmGoods\":false},\"subIntent\":\"新增商品\"},\"shoppingCart\":[],\"vin\":\"VIN4TGTEST0000001\",\"matchAddress\":{\"address\":\"美好香域花境二期5栋\",\"addressDetail\":\"2单元2504\",\"addressLat\":30.620087,\"phone\":\"15971414150\",\"geoHash\":\"wt3nny0yfjgj\",\"addressLon\":114.204001,\"aoiId\":\"[5198452]\",\"receiveUserName\":\"居\",\"addressId\":\"20996055170\"}}";

        slotRecordStr = "{\"eleUserId\":\"62082927\",\"currentSlot\":{\"tradeTime\":\"\",\"address\":{},\"storeName\":\"\",\"items\":[{\"itemName\":\"美食\"}]},\"recommendItem\":{\"itemId\":100000712598219940,\"itemName\":\"卷堡丰盛三人餐\",\"buyCount\":1,\"allSpecs\":[{\"itemId\":100000712598219940,\"tbItemId\":765607456697,\"price\":156,\"tbSkuId\":5267228253278,\"selected\":false,\"skuId\":100001167942878370}],\"allSkuIds\":[100001167942878370],\"matchIngredients\":[],\"matchSpec\":{\"itemId\":100000712598219940,\"tbItemId\":765607456697,\"price\":156,\"tbSkuId\":5267228253278,\"skuId\":100001167942878370},\"minPurchase\":1,\"allAttrs\":[],\"stock\":0,\"itemImageUrl\":\"https://cube.elemecdn.com//e/ef/b766b0ff590ccc9a7ded15e99179ajpg.jpg\"},\"query\":\"来一份外卖\",\"askType\":\"notMatchAddress\",\"updateTime\":1737369598190,\"userId\":\"9000000000817370\",\"havanaId\":\"2204332148477\",\"aiMessage\":\"给你推荐了肯德基宅急送(金银湖店)的卷堡丰盛三人餐，销量和评分都很不错，要试一下吗？\",\"allAddress\":[{\"address\":\"石排湾郊野公园\",\"addressDetail\":\"\",\"phone\":\"15971414150\",\"geoHash\":\"webvb5q5bnb8\",\"name\":\"居\",\"tagType\":2,\"lon\":113.562928,\"aoiId\":\"[5233668]\",\"lat\":22.123025,\"addressId\":\"1920112536094\"},{\"address\":\"武汉中地科技园\",\"addressDetail\":\"东南门\",\"phone\":\"15971414150\",\"geoHash\":\"wt3m73ueyjvu\",\"name\":\"居\",\"tagType\":3,\"lon\":114.40708,\"aoiId\":\"[20656785]\",\"lat\":30.46439,\"addressId\":\"14642729194\"},{\"address\":\"美好香域花境二期5栋\",\"addressDetail\":\"2单元2504\",\"phone\":\"15971414150\",\"geoHash\":\"wt3nny0yfjgj\",\"name\":\"居\",\"tagType\":1,\"lon\":114.204001,\"aoiId\":\"[5198452]\",\"lat\":30.620087,\"addressId\":\"20996055170\"},{\"address\":\"中海·光谷锦城5栋\",\"addressDetail\":\"1903\",\"phone\":\"15971414150\",\"geoHash\":\"wt3mh74mvwp2\",\"name\":\"居\",\"tagType\":0,\"lon\":114.447916,\"aoiId\":\"[5105185]\",\"lat\":30.427655,\"addressId\":\"12691882014\"},{\"address\":\"关谷天地酒店公寓\",\"addressDetail\":\"1212嗨.创美美甲店\",\"phone\":\"15971414150\",\"geoHash\":\"wt3m77ygkffd\",\"name\":\"居\",\"tagType\":0,\"lon\":114.410112,\"aoiId\":\"[44894,20483552]\",\"lat\":30.475274,\"addressId\":\"19540322761\"},{\"address\":\"金地·艺境30栋\",\"addressDetail\":\"1单元2603\",\"phone\":\"15971414150\",\"geoHash\":\"wt3mhjbpq1ed\",\"name\":\"居\",\"tagType\":2,\"lon\":114.433856,\"aoiId\":\"[4054644]\",\"lat\":30.442995,\"addressId\":\"22857341760\"},{\"address\":\"武汉中地科技园\",\"addressDetail\":\"4楼\",\"phone\":\"15971414150\",\"geoHash\":\"wt3m73ueyjvu\",\"name\":\"居菁菁\",\"tagType\":0,\"lon\":114.40708,\"aoiId\":\"[20656785]\",\"lat\":30.46439,\"addressId\":\"18718969452\"},{\"address\":\"福星惠誉·福星城北区1栋\",\"addressDetail\":\"1604 简逸美发店\",\"phone\":\"15971414150\",\"geoHash\":\"wt3npwnkstjp\",\"name\":\"居\",\"tagType\":0,\"lon\":114.244623,\"aoiId\":\"[22703180,1190864]\",\"lat\":30.619697,\"addressId\":\"17641804296\"},{\"address\":\"湖北省妇幼保健院(光谷院区)-住院部\",\"addressDetail\":\"住院部9楼\",\"phone\":\"15971414150\",\"geoHash\":\"wt3mkzvvg6ue\",\"name\":\"居\",\"tagType\":2,\"lon\":114.474595,\"aoiId\":\"[20841332]\",\"lat\":30.497676,\"addressId\":\"1920012565553\"}],\"lastSlot\":{\"tradeTime\":\"\",\"address\":{},\"storeName\":\"麦当劳\",\"items\":[{\"specKeywords\":[\"不辣\"],\"specs\":{},\"itemName\":\"汉堡\",\"buyCount\":1,\"taste\":\"\",\"index\":-1,\"foodCategory\":\"汉堡\",\"scene\":\"\"}]},\"nluResp\":{\"mainIntent\":\"确认选品\",\"slot\":{\"tradeTime\":\"\",\"confirmOrder\":false,\"searchType\":\"正常搜索\",\"shopName\":\"\",\"goods\":[{\"itemId\":\"\",\"number\":1,\"name\":\"\",\"action\":\"新增商品\",\"index\":-1,\"attributes\":{\"keywords\":[],\"taste\":\"\",\"specifications\":{},\"foodCategory\":\"\",\"scene\":\"\"}}],\"confirmGoods\":false},\"subIntent\":\"新增商品\"},\"shoppingCart\":[],\"vin\":\"VIN4TGTEST0000001\",\"storeInfo\":{\"deliveryFee\":6,\"orderLeadTime\":30,\"encryptStoreId\":\"E15078807645175766091\",\"storeName\":\"肯德基宅急送(金银湖店)\"},\"matchAddress\":{\"address\":\"美好香域花境二期5栋\",\"addressDetail\":\"2单元2504\",\"addressLat\":30.620087,\"phone\":\"15971414150\",\"geoHash\":\"wt3nny0yfjgj\",\"addressLon\":114.204001,\"aoiId\":\"[5198452]\",\"receiveUserName\":\"居\",\"addressId\":\"20996055170\"}}";

        // slotRecord
        TTSReqDto slotRecord = JSON.parseObject(slotRecordStr, TTSReqDto.class);

        if (slotRecord == null || slotRecord.getAskType() == null || slotRecord.getNluRespOriginal() == null || slotRecord.getNluRespOriginal().getSlot() == null){
            throw new IllegalArgumentException("参数异常");
        }

        // 匹配到的地址
        TTSReqDto.MatchAddress matchAddress = slotRecord.getMatchAddress();
        // 待确认的地址
        TTSReqDto.MatchAddress addressConfirm = slotRecord.getAddressConfirm();
        // 用户待选择地址列表
        List<TTSReqDto.MatchAddress> toBeSelectAddress = slotRecord.getToBeSelectAddress();

        // 匹配的店铺信息
        TTSReqDto.MatchStore storeInfo = slotRecord.getStoreInfo();
        // 当前推荐的商品，用还没确认
        TTSReqDto.MatchItem recommendItem = slotRecord.getRecommendItem();
        // 用户已经确认选择的商品，类似购物车
        List<TTSReqDto.MatchItem> shoppingCart = slotRecord.getShoppingCart();
        // 订单确认信息
        TTSReqDto.OrderConfirm orderConfirm = slotRecord.getOrderConfirm();

        // 询问场景
        String askType = slotRecord.getAskType();
        // 原始nlu数据
        NluResp nluRespOriginal = slotRecord.getNluRespOriginal();
        // 提取query的槽位信息
        NluResp.Slot slot = nluRespOriginal.getSlot();

        // 主意图
        String mainIntent = nluRespOriginal.getMainIntent();

        // 规格调整
        TTSReqDto.ChangeSpecResult changeSpecResult = slotRecord.getChangeSpecResult();

        /*************************** 一、点外卖 ***************************/
         // 1. 缺少地址槽
         //     query = “来一份外卖”、“帮我买点吃的”、“我想点餐，推荐一下”、“帮我用饿了么点个外卖”、“帮我买个吃的”
         //     tts = “可以先告诉我要送到哪儿吗？”
        if (matchAddress==null &&
                (("推荐商品".equals(mainIntent) || "更改商品数量".equals(mainIntent) || "更改商品".equals(mainIntent) || "更换店铺".equals(mainIntent) || "确认订单".equals(mainIntent))
                || ("确认选品".equals(mainIntent) && !nluRespOriginal.getSlot().isConfirmGoods())
                || ("确认下单".equals(mainIntent) && !nluRespOriginal.getSlot().isConfirmOrder()))
        ){
            tts = "可以先告诉我要送到哪儿吗？";
        }

        // 2. 推荐商品
        // 2.1 无推荐商品   “抱歉，目前没有合适的外卖推荐。要不要换个说法再试试，或者告诉我具体想点的东西？”
        if (recommendItem==null){
            if ("推荐商品".equals(mainIntent)){
                tts = "抱歉，目前没有合适的外卖推荐。要不要换个说法再试试，或者告诉我具体想点的东西？";
            }
            else if("更改商品".equals(mainIntent)){
                if(!CollectionUtils.isEmpty(slot.getGoods())){
                    String action = slot.getGoods().get(0).getAction();
                    // 五、更换商品 - 1.1 无推荐商品
                    if("新增商品".equals(action)){
                        tts = "抱歉，目前没有合适的外卖推荐。要不要换个说法再试试，或者告诉我具体想点的东西？";
                     }
                    // 六、增加商品 - 1.1 无可增加商品
                    else if("增加商品".equals(action)){
                        tts = "抱歉，这家店暂时没有"+slot.getGoods().get(0).getName()+"可添加。您还需要别的吗，或者直接下单？";
                    }
                    // 十、规格调整 - 4. 未命中商品   “抱歉，没找到${商品名称}，可以再说得详细些？如果暂时没别的改动，也可以直接下单。”
                    else if("修改规格".equals(action)){
                        tts = "抱歉，没找到"+slot.getGoods().get(0).getName()+"，可以再说得详细些？如果暂时没别的改动，也可以直接下单。";
                    }
                }
            }
        }
        //       第三轮无结果   “抱歉，还是没找到你想点的外卖。这次可以先用饿了么手机下单，下次直接说‘来份和上次一样的外卖’，我就能根据历史为您推荐啦。
        // todo.. 待添加  redis 3次判断

        // 2.2 推荐单品   “我给您挑了一款热销单品：${店铺名}的${商品名}。要不要试试？”
        else{
            if ("推荐商品".equals(mainIntent)){
                tts = "我给您挑了一款热销单品："+storeInfo.getStoreName()+"的"+recommendItem.getItemName()+"。要不要试试？";
            }
            else if("更改商品".equals(mainIntent)){
                if(!CollectionUtils.isEmpty(slot.getGoods()) && "新增商品".equals(slot.getGoods().get(0).getAction())){
                    tts = "我给您挑了一款热销单品："+storeInfo.getStoreName()+"的"+recommendItem.getItemName()+"。要不要试试？";
                }

                if(!CollectionUtils.isEmpty(slot.getGoods())){
                    String action = slot.getGoods().get(0).getAction();
                    // 五、更换商品 - 1.2 推荐单品
                    if("新增商品".equals(action)){
                        tts = "我给您挑了一款热销单品："+storeInfo.getStoreName()+"的"+recommendItem.getItemName()+"。要不要试试？";
                    }
                    // 六、增加商品 - 1.2 可增加单品
                    else if("增加商品".equals(action)){
                        tts = "好的，"+recommendItem.getItemName()+"已添加。还需要再来点别的吗？没有的话，我给您下单了。";
                    }
                    else if("修改规格".equals(action)){
                        // 十、规格调整 - 1. 命中唯一商品且包含规格，且包含温度、甜度和杯型中任意一个，且有规格值   “已为您将${规格名称}修改为${规格值}，需要现在下单吗？”
                        Map<String, List<String>> changedItems = changeSpecResult.getChangedItems();
                        if(MapUtils.isNotEmpty(changedItems)){
                            // changedItems 取第一个
                            // todo.. 待完善 @常臣青  只有商品名称和规格名称，需要${规格名称}、${规格值1}、${规格值2}、${规格值3}
                            tts = "已为您将${规格名称}修改为${规格值}，需要现在下单吗？";
                        }

                        // 十、规格调整 - 2. 命中唯一商品且包含规格，且包含温度、甜度和杯型中任意一个，无规格值   “规格已为您展开，“当前商品可修改规格的规格包括：${规格名称}，包括${规格值1}、${规格值2}和${规格值3}。”
                        Map<String, List<String>> specNotFoundItems = changeSpecResult.getSpecNotFoundItems();
                        if(MapUtils.isNotEmpty(specNotFoundItems)){
                            // todo.. 待完善 @常臣青  只有商品名称和规格名称，需要${规格名称}、${规格值1}、${规格值2}、${规格值3}
                            tts = "规格已为您展开，“当前商品可修改规格的规格包括：${规格名称}，包括${规格值1}、${规格值2}和${规格值3}。";
                        }

                        // 十、规格调整 - 3. 命中唯一商品且包含规格，不包含温度、甜度和杯型中任意一个   “当前商品无可修改规格，已选中规格分别是${已选规格值}-珍珠、芋艿、全脂牛奶。需要现在下单吗？”
                        // todo.. 与@常臣青沟通无法判断温度、甜度和杯型，做不了，需与产品@黄垚确认

                        // 十、规格调整 - 3. 命中唯一商品但不包含规格   “这款商品只有标准份，没有规格选项。需要现在下单吗？”
                        List<String> noSpecItems = changeSpecResult.getNoSpecItems();
                        if(!CollectionUtils.isEmpty(noSpecItems)){
                            tts = "这款商品只有标准份，没有规格选项。需要现在下单吗？";
                        }

                        // 十、规格调整 - 5. 命中多个商品   “我发现了多个类似『${商品名称}』的商品。您具体想查看哪一个呢？”
                        // todo.. @常臣青 待开发
                    }
                }
            }

        }
        // 2.3 推荐多品   “为您找到了${店铺名}的人气组合：包含${商品A}、${商品B}和${商品C}。要一起下单吗？”
        // 【备注】：与@常臣青 对齐 recommendItem!=null都是单品，目前没有多品

        /*************************** 二、地址确认意图 & 三、含地址的点外卖 ***************************/
        // 1. 地址命中一条，进入订外卖流程
        // todo..  待确认  进入订外卖流程，是否不需要请求tts？还是说请求我tts给空？
        if ("确认地址".equals(mainIntent) && matchAddress!=null){
            tts = "";
        }
        // 2. 地址未命中
        // 2.1 地址槽是标签“家/公司”   “您还没有在饿了么 APP 中设置${家/公司}的地址，这次请先告诉我要送到的具体地址名称吧”
        if (AskTypeEnum.notConfigAddress.getType().equals(askType)){
            tts = "您还没有配置地址！";
        }
        else if(AskTypeEnum.notMatchAddress.getType().equals(askType)){
            if(nluRespOriginal.getSlot()!=null && nluRespOriginal.getSlot().getAddress()!=null){
                NluResp.Address slotAddress = nluRespOriginal.getSlot().getAddress();
                Integer poiType = slotAddress.getPoiType();
                if (poiType==1){
                    tts = "您还没有在饿了么 APP 中设置家的地址，这次请先告诉我要送到的具体地址名称吧";
                }
                else if (poiType==2){
                    tts = "您还没有在饿了么 APP 中设置学校的地址，这次请先告诉我要送到的具体地址名称吧";
                }
                else if (poiType==3){
                    tts = "您还没有在饿了么 APP 中设置公司的地址，这次请先告诉我要送到的具体地址名称吧";
                }
                // 2.2 地址槽是“地址名”  “没有在饿了么地址库中找到『${地址名}』，可能我听错了，请再说一遍地址。”
                else if (poiType==4){
                    tts = "您还没有在饿了么 APP 中设置"+slotAddress.getName()+"的地址，这次请先告诉我要送到的具体地址名称吧";
                }
            }
        }
        // 2.3 若第三轮补槽后，地址仍旧不匹配   “抱歉，仍旧找不到『${地址名}』，建议您先在饿了么 APP 中添加该地址，下次我就能识别了。”
        // todo.. 待添加  redis 3次判断

        // 3. 地址命中多条   “我找到了多个与『${地址名}』相似的地址，可以帮忙确认一下你要送到第几个吗？”
        else if (AskTypeEnum.multipleAddress.getType().equals(askType)){
            if(!CollectionUtils.isEmpty(toBeSelectAddress) && toBeSelectAddress.size()>1
                    && nluRespOriginal.getSlot()!=null && nluRespOriginal.getSlot().getAddress()!=null){
                tts = "我找到了多个与『"+nluRespOriginal.getSlot().getAddress().getName()+"』相似的地址，可以帮忙确认一下你要送到第几个吗？";
            }
        }

         /*************************** 四、变更地址 ***************************/
        // “请问改送到哪里呢？”
        if ("更改配送地址".equals(mainIntent)){
            tts = "请问改送到哪里呢？";
        }

         /*************************** 五、更换商品 ***************************/
        // 1.1 无推荐商品   “抱歉，目前没有合适的外卖推荐。要不要换个说法再试试，或者告诉我具体想点的东西？”
        //       第三轮无结果   “抱歉，还是没找到你想点的外卖。这次可以先用饿了么手机下单，下次直接说‘来份和上次一样的外卖’，我就能根据历史为您推荐啦。
        // 1.2 推荐单品   “我给您挑了一款热销的${店铺名}的${商品名}。要不要试试？”
        // 1.3 推荐多品   “为您找到了${店铺名}的人气组合：包含${商品A}、${商品B}和${商品C}。要一起下单吗？”

        // =======【备注】：[五、更换商品] 包含在 [一、点外卖 2. 推荐商品] 中 =======

         /*************************** 六、增加商品 ***************************/
        // 1.1 无可增加商品   “抱歉，这家店暂时没有 ${商品名}可添加。您还需要别的吗，或者直接下单？”
        //       第三轮无结果   “抱歉，还是没找到可添加的商品。若不是必需，可先下单当前商品；或者稍后方便时在手机挑选，下次我就能根据历史为您推荐了。”
        // 1.2 可增加单品   “好的，${商品名称} 已添加。还需要再来点别的吗？没有的话，我给您下单了。”

        // =======【备注】：[六、增加商品] 包含在 [一、点外卖 2. 推荐商品] 中 =======

         /*************************** 七、删除商品 ***************************/
        if("更改商品".equals(mainIntent)){
            if(!CollectionUtils.isEmpty(slot.getGoods())){
                String action = slot.getGoods().get(0).getAction();
                if("删除商品".equals(action)){
                    TTSReqDto.ItemRemoveResult itemRemoveResult = slotRecord.getItemRemoveResult();
                    // 1. 命中唯一商品，且可删除   “好的，已经删了『${商品名称}』。现在要直接下单吗？”
                    if(itemRemoveResult!=null && !CollectionUtils.isEmpty(itemRemoveResult.getRemoveItemNames())
                            && itemRemoveResult.getRemoveItemNames().size() == 1){
                        // 与@常臣青沟通删除暂时取第一个
                        tts = "好的，已经删了『"+itemRemoveResult.getRemoveItemNames().get(0)+"』。现在要直接下单吗？";
                    }
                    // 4. 命中多个要删除的商品（如多份相同商品名）   “我发现了多个类似『${商品名称}』的商品。您具体是不想要哪一个呢？”
                    else if(itemRemoveResult!=null && !CollectionUtils.isEmpty(itemRemoveResult.getRemoveItemNames())
                            && itemRemoveResult.getRemoveItemNames().size() > 1){
                        tts = "我发现了多个类似『"+slot.getGoods().get(0).getName()+"』的商品。您具体是不想要哪一个呢？";
                    }
                    // 3. 未命中要删除的商品（缺失槽位无法命中 或 购物车里无此商品）   “抱歉，没找到您想删的那份商品。可以再说得详细些？如果暂时没别的改动，也可以直接下单。”
                    else if(itemRemoveResult!=null && !CollectionUtils.isEmpty(itemRemoveResult.getNotFoundItems())){
                        tts = "抱歉，没找到您想删的那份商品。可以再说得详细些？如果暂时没别的改动，也可以直接下单。";
                    }
                }
            }
        }
        // 2. 命中唯一商品，但不可删除（例如删除后无法满足起送费）   “抱歉，无法删除『${商品名称}』，因为会导致${限制理由}。还有别的需要吗，或者直接下单？”
        if (AskTypeEnum.notAllowedItemRemove.getType().equals(askType)){
            if(!CollectionUtils.isEmpty(slot.getGoods())){
                tts = "抱歉，删除『"+slot.getGoods().get(0).getName()+"』会导致订单将低于起送费，无法配送。还有别的需要吗，或者直接下单？";
            }
        }

         /*************************** 八、商品查询 ***************************/
         // “好的，已为您展开当前的商品列表”
        if("查询购物车".equals(mainIntent)){
            tts = "好的，已为您展开当前的商品列表";
        }

         /*************************** 九、规格查询 ***************************/
        // 1. 命中唯一商品且包含规格，且包含温度、甜度和杯型中任意一个    “规格已为您展开，分别是${已选规格值1}、${已选规格值2}、${已选规格值3}；其中${规格-温度/甜度/杯型}可以选择${规格值}”；
        // 示例：规格已为您展开，分别是温度：热的、奶油顶刨花：不加。其中温度可以选择：冷的、热的、加冰、不加冰
        // 2. 命中唯一商品且包含规格，不包含温度、甜度和杯型中任意一个   “规格已为您展开，分别是${已选规格值1}、${已选规格值2}、${已选规格值3}；
        // 示例：规格已为您展开，分别是吉士、番茄酱、洋葱碎
        // 3. 命中唯一商品但不包含规格   “这款商品只有标准份，没有规格选项。需要现在下单吗？”
        // 4. 未命中商品   “抱歉，没找到${商品名称}，可以再说得详细些？如果暂时没别的改动，也可以直接下单。”
        // 5. 命中多个商品   “我发现了多个类似『${商品名称}』的商品。您具体想查看哪一个呢？”
        if("查询规格".equals(mainIntent)){
            // todo.. @常臣青 待开发 需添加字段
        }

         /*************************** 十、规格调整 ***************************/
        // 1. 命中唯一商品且包含规格，且包含温度、甜度和杯型中任意一个，且有规格值   “已为您将${规格名称}修改为${规格值}，需要现在下单吗？”
        // 2. 命中唯一商品且包含规格，且包含温度、甜度和杯型中任意一个，无规格值   “规格已为您展开，“当前商品可修改规格的规格包括：${规格名称}，包括${规格值1}、${规格值2}和${规格值3}。”
        // 3. 命中唯一商品且包含规格，不包含温度、甜度和杯型中任意一个   “当前商品无可修改规格，已选中规格分别是${已选规格值}-珍珠、芋艿、全脂牛奶。需要现在下单吗？”
        // 3. 命中唯一商品但不包含规格   “这款商品只有标准份，没有规格选项。需要现在下单吗？”
        // 4. 未命中商品   “抱歉，没找到${商品名称}，可以再说得详细些？如果暂时没别的改动，也可以直接下单。”
        // 5. 命中多个商品   “我发现了多个类似『${商品名称}』的商品。您具体想查看哪一个呢？”

        // =======【备注】：[十、规格调整] 包含在 [一、点外卖 2. 推荐商品] 中 =======

         /*************************** 十一、数量调整 ***************************/
        if("更改商品数量".equals(mainIntent)){
            TTSReqDto.CountChangeResult countChangeResult = slotRecord.getCountChangeResult();
            // 1. 命中唯一商品，且可改数量   “好的，已经把『${商品名称}』的数量改为${数量}。需要下单吗？”
            if (countChangeResult!=null && MapUtils.isNotEmpty(countChangeResult.getChangedItems())){
                Map<String, Integer> changedItems = countChangeResult.getChangedItems();
                List<String> keys = new ArrayList<>(changedItems.keySet());
                tts = "好的，已经把『"+keys.get(0)+"』的数量改为"+changedItems.get(keys.get(0))+"。需要下单吗？";
            }
            // 2. 命中唯一商品，但不可改数量（例如减少数量后无法满足起送费）   “抱歉，无法调整${商品名称}的数量为${数量}，调整后${限制理由}#订单将低于起送费#，导致无法配送。”
            if (AskTypeEnum.notAllowedCountEdit.getType().equals(askType)){
                // 暂不考虑多意图
                List<NluResp.Good> goods = slot.getGoods();
                if(!CollectionUtils.isEmpty(goods)){
                    tts = "抱歉，无法调整"+goods.get(0).getName()+"的数量为"+goods.get(0).getNumber()+"，调整后订单将低于起送费，导致无法配送。";
                }
            }
            // 3. 未命中要改数量的商品（购物车里并无此商品）   “抱歉，没找到您想改数量的商品。商品可以再说得更详细些？如果不想调整，也可以直接下单。”
            if (countChangeResult!=null && !CollectionUtils.isEmpty(countChangeResult.getNotFoundItems())){
                tts = "抱歉，没找到您想改数量的商品。商品可以再说得更详细些？如果不想调整，也可以直接下单。";
            }
            // 4. 命中多个要改数量的商品（如多份相同商品名）   “我发现了多个类似『${商品名称}』的商品。您具体想改哪一个？”
            // todo.. 待完善 @常臣青，暂时只会命中一个
        }

         /*************************** 十二、选品确认 ***************************/
        // 1. 下单时异常   “抱歉，提交订单时出了点异常。已为您重新推荐${商品名称}。”
        if (AskTypeEnum.orderFailed.getType().equals(askType)){
            tts = "抱歉，提交订单时出了点异常。已为您重新推荐"+recommendItem.getItemName()+"。";
        }

        // 2. 匹配优惠券 & 根据ETA可调整派送时间   “已为您匹配到${优惠券}，订单金额${金额}元，已根据您到达${地址}的时间，智能匹配外卖预计送达时间为${送达时间}，是否确认下单？
        // 3. 匹配优惠券 & 根据ETA不可调整派送时间   “已为您匹配到${优惠券}，订单金额${金额}元，预计外卖派送时间为${送达时间}，是否确认下单？
        // 4. 无匹配优惠券 & 根据ETA可调整派送时间   “订单金额${金额}元，已根据您到达${地址}的时间，智能匹配外卖预计送达时间为${送达时间}，是否确认下单？
        // 5. 无匹配优惠券 & 根据ETA不可调整派送时间   “订单金额${金额}元，预计外卖派送时间为${送达时间}，是否确认下单？
        // todo.. 上述2、3、4、5 四种情况目前只无法区分，待@常臣青完善 需要4种状态
        if("选品确认".equals(mainIntent)){
            // todo.. 待开发 1.@常臣青  ${配送状态}、${送达时间}取值  2.待确认@黄垚 ${优惠券}是取金额还是取名称？名称需要@常臣青提供
            if(orderConfirm!=null && matchAddress!=null){
                tts = "已为您匹配到"+orderConfirm.getDiscountAmount()+"，订单金额"+orderConfirm.getTotalAmount()+"元，已根据您到达"
                        +matchAddress.getAddress()+"的时间，智能匹配外卖预计送达时间为"+orderConfirm.getDeliverTime()+"，是否确认下单？";
            }
        }

         /*************************** 十三、下单确认 ***************************/
        // 1. 支付成功   “支付成功，商家已收到订单，开始备餐。请您耐心等待。”
        if (AskTypeEnum.payFailed.getType().equals(askType)){
            tts = "支付成功，商家已收到订单，开始备餐。请您耐心等待。";
        }

        // 2. 支付失败 未开通免密   “抱歉，支付未成功。您尚未开通免密支付，你可以在手机上完成支付。”
        //todo.. 与@常臣青沟通 无法判断此情况，待与产品确认

        // 3. 支付失败 超免密额度   “抱歉，支付未成功。此笔订单超出免密额度，您可以在手机上改用其他支付方式。”
        //todo.. 与@常臣青沟通 无法判断此情况，待与产品确认

        // 4. 支付失败 其他原因   “抱歉，支付失败。请稍后手机重试。”
        if (AskTypeEnum.payFailed.getType().equals(askType)){
            tts = "抱歉，支付失败。请稍后手机重试。";
        }

         /*************************** 十四、外卖进度查询 ***************************/
        // 1. 多个外卖订单   “您当前有多笔外卖正在配送，其中最快送达的订单是『××店铺/××商品』，预计${送达时间}分钟后送达。”
        // todo.. 待开发 @常臣青

        // 2. 一个外卖订单   “您有一单外卖${配送状态}#正在配送#，预计${送达时间}分钟后送达。”
        if("查询订单状态".equals(mainIntent)){
            // todo.. 待开发 @常臣青  ${配送状态}、${送达时间}取值
            tts = "您有一单外卖${配送状态}#正在配送#，预计${送达时间}分钟后送达。";
        }

        // 3. 没有订单   “目前没有外卖订单在配送。要不要先去点一份”
        // todo.. 待开发 @常臣青

         /*************************** 十五、取消点外卖 ***************************/
         // “是否确认取消。”
        if("取消点餐".equals(mainIntent)){
            tts = "是否确认取消。";
        }
        else if("确认订单".equals(mainIntent) && slot!=null && slot.isConfirmOrder()){
            tts = "是否确认取消。";
        }
    }

}
